//package com.faner.fast.rabbitmq.mq;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.AmqpException;
//import org.springframework.amqp.core.MessageDeliveryMode;
//import org.springframework.amqp.core.MessagePostProcessor;
//import org.springframework.amqp.rabbit.core.RabbitTemplate;
//import org.springframework.amqp.rabbit.connection.CorrelationData;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.messaging.Message;
//import org.springframework.messaging.MessageHeaders;
//import org.springframework.messaging.support.MessageBuilder;
//
//import java.util.Map;
//import java.util.UUID;
//
///**
// * @Description:
// */
//@Slf4j
//@Component
//public class SendMessage {
//
//    @Autowired
//    private RabbitTemplate rabbitTemplate;
//
//    @Autowired
//    private ReturnCallbackService returnCallbackService;
//
//    /**
//     * 	这里就是确认消息的回调监听接口，用于确认消息是否被broker所收到
//     */
//    final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
//        /**
//         * 	@param correlationData 作为一个唯一的标识
//         * 	@param ack broker 是否落盘成功
//         * 	@param cause 失败的一些异常信息
//         */
//        @Override
//        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
//            System.err.println("消息ACK结果:" + ack + ", correlationData: " + correlationData.getId());
//        }
//    };
//
//
//    /**
//     * @param exchange   交换机
//     * @param routingKey 队列
//     * @param message        消息体
//     * @param properties	额外的附加属性
//     * @description 发送消息
//     * @date 2020/6/29 16:22
//     */
//    public void sendMessage(String exchange, String routingKey, Object message , Map<String, Object> properties) {
//
//        /**
//         * 确保消息发送失败后可以重新返回到队列中
//         * 注意：yml需要配置 publisher-returns: true
//         */
//        rabbitTemplate.setMandatory(true);
//
//
//        /**
//         * 消费者确认收到消息后，手动ack回执回调处理
//         */
//        rabbitTemplate.setConfirmCallback(confirmCallback);
//        /**
//         * 消息投递到队列失败回调处理
//         */
//        rabbitTemplate.setReturnCallback(returnCallbackService);
//
//        /**
//         * 发送消息
//         */
//        MessageHeaders mhs = new MessageHeaders(properties);
//        Message<?> msg = MessageBuilder.createMessage(message, mhs);
//
//        // 	指定业务唯一的iD
//        CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString());
//        MessagePostProcessor mpp = new MessagePostProcessor() {
//            @Override
//            public org.springframework.amqp.core.Message postProcessMessage(org.springframework.amqp.core.Message message)
//                    throws AmqpException {
//                System.err.println("---> post to do: " + message);
//                //给消息设置延迟毫秒值
//                message.getMessageProperties().setExpiration(String.valueOf(2 * 1000));
//                return message;
//            }
//        };
//        rabbitTemplate.convertAndSend(exchange,
//                routingKey,
//                msg, mpp, correlationData);
//    }
//
//    public static void main(String[] args) {
//        System.out.println(System.currentTimeMillis());
//    }
//}
